/**
 * 自定义验证器
 */
const validate = require('../validate');
class index extends validate {
    rule = {
        name: 'require|regular:^[\\w\\u4E00-\\u9FA5]{2,15}$',
        email: 'require|email|between:5,30',
        password: 'require|numberEn|min:5|max:32',
        code: 'require|int|between:1,10',
        jsCode: 'require|min:3|max:32',
        authorization: 'require|isAuthorization',
        type: 'numberEn|between:1,20',
        Bindtype: { require: true, regular: '^(qq|wx)$' }
    };

    message = {
        name: '尊称格式不对哦!',
        email: '邮箱地址格式不正确',
        code: '验证码格式不正确',
        password: '密码不符合规则',
        'password.min': '密码最小${1}个字符',
        'password.max': '密码最大${1}个字符',
        jsCode: 'code格式不正确',
        authorization: 'token格式不正确',
        type: '类型错误',
        Bindtype: '绑定类型错误'
    };

    /**
     * 快捷场景(优先级低于方法的场景)
     * 数组选择的字段只能是rule已经配置好的(没有rule配置的将无效)
     */
    scene = {
        Login: ['email', 'password'],
        minilogin: ['jsCode'],
        miniBind: ['jsCode', 'Bindtype'],
        reg: ['name', 'email', 'password', 'code'],
        name: ['name'],
        updatePass: ['password', 'code'],
        sendMail: ['email'],
        token: ['authorization'],
        bindMail: ['email', 'code'],
        uploadImage: ['type']
    };


    /**
     * 登录的验证场景(必须scene开头的方法)(优先级高于scene属性)
     * @returns 
     */
    sceneTest(that) {
        return that.only(['account'])// 'password', 'age'
            // .append('account', 'max:15')//增加一个规则(字符串)
            // .append('age', 'require|between:1,3|int')//增加多个规则(字符串)
            // .remove('password', 'numberEn')//移除指定的
            // .remove('password', 'numberEn|min')//移除指定的多个(字符串)
            // .remove('password', ['numberEn','max'])//移除指定的多个(数组)
            // .remove('password')//移除该字段全部
            .append('password', { min: 1, max: 10, isYoyo: true });//增加一个规则(对象)
    }

    /**
     * 验证是否合格的token认证(后端|不支持异步|否则抛出会报错)
     * @param {Any} value 指定字段的值
     * @param {String} field 字段名
     * @param {Object} data 需要验证的所有数据
     */
    isAuthorization(value, field, data) {
        if (/^Bearer\s.+\..+\..+$/i.test(value)) {
            return true;
        }

        return 'token格式不正确';
    }

    /**
     * 自定义方法进行验证(后端|不支持异步|否则抛出会报错)
     * @param {Any} value 指定字段的值
     * @param {String} field 字段名
     * @param {Object} data 需要验证的所有数据
     */
    isYoyo(value, field, data) {
        // return '自定义拦截';
        return true;
    }
}

module.exports = (scene) => index.validate(scene);